<?php
   
    /**
    * xmlwriter.class.php
    * Esta clase contiene la funcionalidad necesaria para generar un XML simple
    * @author Sebastian Lara <slara@grvertice.com>
    * @version 1.0
    * @created 20/DEC/2012
    * @copyright
    */

    class Xml_Writer {
        private $xml; //cadena con los tags XML a generar
        private $stack; // pila de etiquetas usadas en el XML a generar

        /**
        * Función constructora de la clase, se inicializan las variables locales.
        * @param string $indent, carater (s) para identar las etiquetas del mxl
        * @return none
        * @created 20/DEC/2012
        * @author Sebastián Lara <slara@grverice.com>
        */
        function __construct() {
            $this->xml = '<?xml version="1.0" encoding="utf-8"?>';
            $this->stack = array ();
        }


        /**
        * Funcion responsable de abrir una etiqueta madre para el XML a generar.
        * @param strint $tag, representa el nombre de la etiqueta a generar.
        * @param array $atributesList, representa el arreglo de atributos que la
        * etiqueta va a poseer.
        * @return none
        * @created 20/DEC/2012
        * @author Sebastián Lara <slara@grverice.com>
        */
        function openElementParent($tagParent, $attributesList = array ()) {
            $this->xml .= '<'.$tagParent;
            
            if (! empty ($attributesList) && is_array ($attributesList)) {
                foreach ($attributesList as $key => $value) {
                    $this->xml .= ' ' . $key . '="' . htmlentities ($value) . '"';
                }
            }

            $this->xml .= ">";
            $this->stack[] = $tagParent;
        }


        /**
        * Función responsable de agregar una etiqueta hija a una madre ya generada
        * @param string $tagChild, nombre de la etiqueta hija a crear
        * @param string $valueTag, contenido de la etiqueta hija a crear
        * @param array $attributesList, lista de atributos par la etiqueta a generar
        * @return none
        * @created 20/DEC/2012
        * @author Sebastián Lara <slara@grverice.com>
        */
        function addElementChild($tagChild, $valueTag, $attributesList = array()) {
            $this->xml .= '<'.$tagChild;
            foreach ($attributesList as $key => $value) {
                $this->xml .= ' '.$key.'="'.htmlentities($value).'"';
            }
            $this->xml .= '>'.htmlentities($valueTag).'</'.$tagChild.'>';
        }


        /**
        * Funcion responsable de cerrar una etiqueta madre para el XML a generar.
        * @param none
        * @return none
        * @created 20/DEC/2012
        * @author Sebastián Lara <slara@grverice.com>
        */
        function closeElementParent() {
            $element = array_pop($this->stack);
            $this->xml .= "</$element>\n";
        }

        /**
        * Función responsable de retornar el XML generado
        * @param none
        * @return none
        * @created 20/DEC/2012
        * @author Sebastián Lara <slara@grverice.com>
        */
        function getXml() {
            $xmlResponse = $this->xml;
            $this->xml = '<?xml version="1.0" encoding="utf-8"?>';
            return $xmlResponse;
        }
    }